package org.reflection;

import org.annotation.MyAnnotation;
import org.annotation.MyClass;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class ReflectionExample {

    public static void main(String[] args) {
        try {
            // 获取MyClass的Class对象
            Class<?> clazz = MyClass.class;//获取MyClass方法一
            Class<?> clazz1 = Class.forName("org.annotation.MyClass");//获取MyClass方法二
            MyClass obj = new MyClass();
            Class<?> clazz2 = obj.getClass();//获取MyClass方法三

            // 获取myMethod方法
            Method method = clazz.getMethod("myMethod");

            // 检查方法上是否有MyAnnotation注解
            if (method.isAnnotationPresent(MyAnnotation.class)) {
                // 获取注解实例
                MyAnnotation annotation = method.getAnnotation(MyAnnotation.class);

                // 输出注解的值
                System.out.println("Annotation value: " + annotation.value());
                System.out.println("Annotation count: " + annotation.count());
            }
            // 创建MyClass的实例
            Object instance = clazz.getDeclaredConstructor().newInstance();



            // 获取所有公共构造方法（无参）
            Constructor<?>[] constructors = clazz.getConstructors();
            for (Constructor<?> constructor : constructors) {
                System.out.println("Constructor: " + constructor.getName());
            }

            // 获取指定参数的构造方法（指定参数）
            Constructor<?> constructor = clazz.getConstructor(String.class, int.class);
            System.out.println("Constructor with parameters: " + constructor.getName());

            // 获取myMethod方法
            Method method1 = clazz.getMethod("myMethod");
            // 获取指定方法
            Method method2 = clazz.getMethod("myMethod", String.class);



            // 调用无参方法
            method1.invoke(instance);
            // 调用有参方法
            method2.invoke(instance,"hello");
            // 获取指定字段
            Field field = clazz.getDeclaredField("name");
            field.setAccessible(true); // 设置可访问性
            field.set(instance, "ppk");
            System.out.println("Updated field value: " + field.get(instance));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
